package 力扣链表;

import java.util.Hashtable;
import java.util.Map;

public class Leedcode3最长无重复字串 {
    public int lengthOfLongestSubstring(String str) {
        Map hashtable = new Hashtable<Integer, Character>();
        int left = 0;//源字符串左指针
        int right = 0;//右指针
        int len = str.length();//字符串的长度
        int maxLen = 0;
        char[] chars = new char[len];
        chars = str.toCharArray();
        boolean flag = false;
        boolean flag1 = false;
        if (str.length() == 1) {
            return 1;
        }
        if (str.length() == 0) {
            return 0;
        }
        //如果字符串的长度大于1，将循环遍历字符串
        //设置一个变量i，每循环一次就将i加入到表中，判断要加入的元素是否存在，
        // 如果已经存在，则将maxLen设置成i-left，将left移动到重复的字符的后一个位置，继续判断，直到i到达最大值
        hashtable.put(right, chars[right]);//将第一元素放入到hashTable中
        //开始循环放入chars中的字符
        for (int i = 1; i < chars.length; i++) {

            //判断要存放的i是否已经存在于hashTable中
            if (hashtable.containsValue(chars[i])) {
                flag = true;
                //比较i-left和maxlen的大小。maxLen取较大值
                maxLen = maxLen > i-left ? maxLen : i-left;
                while (hashtable.get(left).equals(chars[i]) == false) {
                    //将left从表中移除
                    hashtable.remove(left);
                    left++;
                }
                //将left从表中移除
                hashtable.remove(left);
                left++;
                //然后将left重设置成重复的出现的那个字符的后一个位置
                hashtable.put(i, chars[i]);
            } else {
                hashtable.put(i, chars[i]);
                maxLen = maxLen > hashtable.size()? maxLen : hashtable.size();
            }
        }
        if (flag){
            return maxLen;
        }else {
            return hashtable.size();
        }
    }
}
